package application;

import android.app.Application;
import android.content.Context;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.os.Build;
import android.os.Environment;
import android.os.StrictMode;
import android.support.annotation.Nullable;
import android.support.multidex.MultiDex;
import android.text.TextUtils;

import com.netease.nimlib.sdk.NIMClient;
import com.netease.nimlib.sdk.SDKOptions;
import com.netease.nimlib.sdk.StatusBarNotificationConfig;
import com.netease.nimlib.sdk.auth.LoginInfo;
import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum;
import com.netease.nimlib.sdk.uinfo.UserInfoProvider;
import com.netease.nimlib.sdk.uinfo.model.UserInfo;
import com.netease.nimlib.sdk.util.NIMUtil;
import com.qiyukf.unicorn.api.ImageLoaderListener;
import com.qiyukf.unicorn.api.Unicorn;
import com.qiyukf.unicorn.api.UnicornImageLoader;
import com.qiyukf.unicorn.api.YSFOptions;

import org.litepal.LitePalApplication;

import java.io.IOException;
import java.security.PublicKey;

import crash.CrashHandler;
import student.andlei.com.student.R;
import ui.activity.MainActivity;
import utils.NetUtils;
import utils.RsaHelper;
import utils.SPUtils;
import utils.storage.StorageUtil;

public class App extends Application {

    private static App app;
    private Bitmap mScreenCaptureBitmap;
    private static SharedPreferences preferences;
    public final static String publicModulus="<RSAKeyValue><Modulus>67ZHwcU1A51q4v8fqcy3yw60fxeb9K/eii+0ow/b8wVlUxNNjyla2wTKQkxmP5wP1BjTTWZnjFQ43PEC9wIe0XLin9XtvXtTBIJvrLuPkrhU38fW9Evzt+r9DH08QsDu1qS82siss1H8n4W09xMUBvDXy6W8faeLDf0NzCtbwas=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
    public static PublicKey publicKey = RsaHelper.decodePublicKeyFromXml(publicModulus);
    //Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getAbsolutePath()；
    // Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
    public static String storageUrl = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getAbsolutePath();
            //Environment.getExternalStorageDirectory().getAbsolutePath();
    private static final String TAG = "Init";
    @Override
    public void onCreate() {
        super.onCreate();
        app = this;
        LitePalApplication.initialize(this);
        CrashHandler crashHandler = CrashHandler.getInstance();
        // 注册crashHandler
        crashHandler.init(getApplicationContext());
        NetUtils utils  = new NetUtils(getApplicationContext());
        String dir = StorageUtil.getAppCacheDir(this.getApplicationContext()) + "/student";
        StorageUtil.init(this, dir);

        // SDK初始化（启动后台服务，若已经存在用户登录信息， SDK 将完成自动登录）
        NIMClient.init(app, getLoginInfo(), options());
        // ... your codes
        if (NIMUtil.isMainProcess(this)) {
            // 注意：以下操作必须在主进程中进行
            // 1、UI相关初始化操作
            // 2、相关Service调用
        }
        //Toast.makeText(app,"app初始化操作",Toast.LENGTH_LONG).show();
        //解决安卓7.0手机拍照闪退的问题
        StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
        StrictMode.setVmPolicy(builder.build());
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
            builder.detectFileUriExposure();
        }
        // appKey 可以在七鱼管理系统->设置->APP接入 页面找到
        Unicorn.init(this, "794ab34690e83fedabef43143575672c", Unoptions(), new UnicornImageLoader() {
            @Nullable
            @Override
            public Bitmap loadImageSync(String uri, int width, int height) {
                return null;
            }

            @Override
            public void loadImage(String uri, int width, int height, ImageLoaderListener listener) {

            }
        });
    }
    // 如果返回值为null，则全部使用默认参数。
    private YSFOptions Unoptions() {
        YSFOptions options = new YSFOptions();
        options.statusBarNotificationConfig = new com.qiyukf.unicorn.api.StatusBarNotificationConfig();
        return options;
    }

    public static App getInstance() {
        return app;
    }

    public static SharedPreferences getPreferences() {
        if (preferences == null) {
            preferences = app.getSharedPreferences("SharedPreferences", MODE_PRIVATE);
        }
        SharedPreferences.Editor edit = preferences.edit();

        edit.putString("putString", "string").apply();

        edit.remove("putString").apply();

        edit.clear().apply();

        return preferences;
    }
    // 如果返回值为 null，则全部使用默认参数。
    private SDKOptions options() {
        SDKOptions options = new SDKOptions();
        // 如果将新消息通知提醒托管给 SDK 完成，需要添加以下配置。否则无需设置。
        StatusBarNotificationConfig config = new StatusBarNotificationConfig();
        config.notificationEntrance = MainActivity.class; // 点击通知栏跳转到该Activity
        config.notificationSmallIconId = R.mipmap.ic_launcher;
        // 呼吸灯配置
        config.ledARGB = Color.GREEN;
        config.ledOnMs = 1000;
        config.ledOffMs = 1500;
        // 通知铃声的uri字符串
       // config.notificationSound = "android.resource://com.netease.nim.demo/raw/msg";
        options.statusBarNotificationConfig = config;
        // 配置保存图片，文件，log 等数据的目录
        // 如果 options 中没有设置这个值，SDK 会使用采用默认路径作为 SDK 的数据目录。
        // 该目录目前包含 log, file, image, audio, video, thumb 这6个目录。
//        String sdkPath = getAppCacheDir(app.getBaseContext()) + "/nim"; // 可以不设置，那么将采用默认路径
        String sdkPath = Environment.getExternalStorageDirectory() + "/" + getPackageName() + "/nim";

        // 如果第三方 APP 需要缓存清理功能， 清理这个目录下面个子目录的内容即可。
        options.sdkStorageRootPath = sdkPath;

        // 配置是否需要预下载附件缩略图，默认为 true
        options.preloadAttach = true;

        // 配置附件缩略图的尺寸大小。表示向服务器请求缩略图文件的大小
        // 该值一般应根据屏幕尺寸来确定， 默认值为 Screen.width / 2
        options.thumbnailSize = 1000 / 2;

        // 用户资料提供者, 目前主要用于提供用户资料，用于新消息通知栏中显示消息来源的头像和昵称
        options.userInfoProvider = new UserInfoProvider() {
            @Override
            public UserInfo getUserInfo(String account) {
                return null;
            }
            @Override
            public String getDisplayNameForMessageNotifier(String account, String sessionId,
                                                           SessionTypeEnum sessionType) {
                return null;
            }

            @Override
            public Bitmap getAvatarForMessageNotifier(SessionTypeEnum sessionTypeEnum, String s) {
                return null;
            }
        };
        return options;
    }
    // 如果已经存在用户登录信息，返回LoginInfo，否则返回null即可
    private LoginInfo loginInfo() {
        return null;
    }
    private LoginInfo getLoginInfo() {
        String account = SPUtils.getInstance(app).getString("accid");
        String token = SPUtils.getInstance(app).getString("token");

//        if (!TextUtils.isEmpty(account) && !TextUtils.isEmpty(token)) {
//            DemoCache.setAccount(account.toLowerCase());
//            return new LoginInfo(account, token);
//        } else {
//            return null;
//        }
        return new LoginInfo(account, token);
    }
    public Bitmap getmScreenCaptureBitmap() {
        return mScreenCaptureBitmap;
    }

    public void setmScreenCaptureBitmap(Bitmap mScreenCaptureBitmap) {
        this.mScreenCaptureBitmap = mScreenCaptureBitmap;
    }
    /**
     * 配置 APP 保存图片/语音/文件/log等数据的目录
     * 这里示例用SD卡的应用扩展存储目录
     */
   public static String getAppCacheDir(Context context) {
        String storageRootPath = null;
        try {
            // SD卡应用扩展存储区(APP卸载后，该目录下被清除，用户也可以在设置界面中手动清除)，请根据APP对数据缓存的重要性及生命周期来决定是否采用此缓存目录.
            // 该存储区在API 19以上不需要写权限，即可配置 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18"/>
            if (context.getExternalCacheDir() != null) {
                storageRootPath = context.getExternalCacheDir().getCanonicalPath();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (TextUtils.isEmpty(storageRootPath)) {
            // SD卡应用公共存储区(APP卸载后，该目录不会被清除，下载安装APP后，缓存数据依然可以被加载。SDK默认使用此目录)，该存储区域需要写权限!
            storageRootPath = Environment.getExternalStorageDirectory() + "/" + app.getPackageName();
        }

        return storageRootPath;
    }
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(base);
    }
}
